import java.util.*;

/*
试除法判定质数
给定 n个正整数 ai，判定每个数是否是质数。

输入格式
第一行包含整数 n。
接下来 n行，每行包含一个正整数 ai。

输出格式
共 n行，其中第 i行输出第 i个正整数 ai是否为质数，是则输出 Yes，否则输出 No。

数据范围
1≤n≤100,1≤ai≤2^31−1

输入样例：
2
2
6

输出样例：
Yes
No
 */
//public class Main {
//    static boolean isPrime(int n) {
//        if (n < 2) return false;
//        for (int i = 2; i <= n / i; i++) {
//            if (n % i == 0) return false;
//        }
//        return true;
//    }
//
//    public static void main(String[] args) {
//        Scanner sc = new Scanner(System.in);
//        int n = sc.nextInt();
//        while (n-- > 0) {
//            if (isPrime(sc.nextInt())) System.out.println("Yes");
//            else System.out.println("No");
//        }
//    }
//}

/*
分解质因数
给定 n个正整数 ai，将每个数分解质因数，并按照质因数从小到大的顺序输出每个质因数的底数和指数。

输入格式
第一行包含整数 n。
接下来 n行，每行包含一个正整数 ai。

输出格式
对于每个正整数 ai，按照从小到大的顺序输出其分解质因数后，每个质因数的底数和指数，每个底数和指数占一行。
每个正整数的质因数全部输出完毕后，输出一个空行。

数据范围
1≤n≤100,
2≤ai≤2×1e9

输入样例：
2
6
8

输出样例：
2 1
3 1
2 3
 */

//public class Main {
//    //注意：n中最多只包含1个大于sqrt(n)的质因子
//    static void primeFactorDecomposition(int n) {
//        for (int i = 2; i <= n / i; i++) {
//            int cnt = 0;
//            if (n % i == 0) {
//                while (n % i == 0) {
//                    cnt++;
//                    n /= i;
//                }
//                System.out.println(i + " " + cnt);
//            }
//        }
//        if (n > 1) System.out.println(n + " " + 1);
//    }
//
//    public static void main(String[] args) {
//        Scanner sc = new Scanner(System.in);
//        int n = sc.nextInt();
//        while (n-- > 0) {
//            primeFactorDecomposition(sc.nextInt());
//        }
//    }
//}

/*
筛质数
给定一个正整数 n，请你求出 1∼n 中质数的个数。

输入格式
共一行，包含整数 n。

输出格式
共一行，包含一个整数，表示1∼n 中质数的个数。

数据范围
1≤n≤1e6

输入样例：
8

输出样例：
4

 */

class Main {
    static int[] primes;
    static boolean[] visited;
    static int count;

    //朴素筛法
    static void getPrimesPrimary(int n) {
        for (int i = 2; i <= n; i++) {
            if (!visited[i]) {
                primes[count++] = i;
            }
            for (int j = i * 2; j <= n; j += i) {
                visited[j] = true;
            }
        }
    }

    //埃氏筛法
    static void getPrimesEratosthenes(int n) {
        for (int i = 2; i <= n; i++) {
            if (!visited[i]) {
                primes[count++] = i;
                for (int j = i * 2; j <= n; j += i) {
                    visited[j] = true;
                }
            }
        }
    }

    //线性筛法
    static void getPrimesLinear(int n) {
        for (int i = 2; i <= n; i++) {
            if (!visited[i]) {
                primes[count++] = i;
            }
            for (int j = 0; primes[j] <= n / i; j++) {
                visited[primes[j] * i] = true;
                if (i % primes[j] == 0) {
                    break;
                }
            }
        }
    }

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        primes = new int[n+1];
        visited = new boolean[n+1];

        //getPrimesPrimary(n);
        //getPrimesEratosthenes(n);
        getPrimesLinear(n);
        System.out.println(count);
        //for (int i = 0; i < count; i++) System.out.print(primes[i] + " ");
    }
}